package br.com.comanda.util;

import java.util.ArrayList;
import java.util.List;

/**
 * Classe utilitaria com metodos para manipulacao e verificacao de objetos do
 * tipo String
 * 
 * @author thiago
 * @since 09/01/2013
 */
public final class StringUtils {

	/**
	 * Construtor de classe utilitaria deve ser privado pois não pode ser
	 * instanciada.
	 */
	private StringUtils() {
		super();
	}

	public static String valueOf(Object object) {
		String value = String.valueOf(object);
		return value.equals("null") ? "" : value;
	}

	/**
	 * Faz o toLowerCase de uma string fazendo null-check
	 */
	public static String lower(String value) {
		if (value == null) {
			return "";
		} else {
			return value.toLowerCase();
		}
	}

	/**
	 * Faz o toUpperCase de uma string fazendo null-check
	 */
	public static String upper(String value) {
		if (value == null) {
			return "";
		} else {
			return value.toUpperCase();
		}
	}

	/**
	 * Passado uma String como parametro, verifica se possui conteudo.
	 * 
	 * @param {@link String} value
	 * @return {@link boolean} true or false
	 */
	public static boolean hasLength(String value) {
		return (value == null || value.trim().length() == 0) ? false : true;
	}

	/**
	 * Passado varias strings como parametro, retorna false se algum for vazio
	 * ou retorna true caso todos tenham conteudo.
	 * 
	 * @param values
	 * @return {@link boolean} true or false
	 */
	public static boolean noOneIsEmpty(String... values) {
		for (String value : values) {
			if (!StringUtils.hasLength(value)) {
				return false;
			}
		}

		return true;
	}

	/**
	 * Sub String
	 * 
	 * @param string
	 * @param start
	 * @param size
	 * @return
	 */
	public static String subString(String string, int start, int size) {
		return string.substring(start, start + size);
	}

	/**
	 * Realiza a quebra de uma string de acordo com um caracter especifico
	 * 
	 * @param value
	 * @param charToSplit
	 * @return
	 */
	public static String[] split(String value, char charToSplit) {
		List<String> list = new ArrayList<String>();

		StringBuilder split = new StringBuilder();

		for (int i = 0; i < value.length(); i++) {
			if (value.charAt(i) == charToSplit) {
				list.add(split.toString());
				split.delete(0, split.length() - 0);
			} else {
				split.append(value.charAt(i));
			}
		}

		if (split.length() != 0) {
			list.add(split.toString());
		}

		return ArrayUtils.toStringArray(list);
	}

	/**
	 * Verifica se uma string é formada por numeros
	 * 
	 * @param str
	 * @return
	 */
	public static boolean isNumber(String str) {
		try {
			Integer.parseInt(str);
			return true;
		} catch (NumberFormatException nfe) {
		}
		return false;
	}
}
